//
// Subsystem.h
//
// Library: Util
// Package: Application
// Module:  Subsystem
//
// Definition of the Subsystem class.
//
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Util_Subsystem_INCLUDED
#define Util_Subsystem_INCLUDED


#include "Poco/RefCountedObject.h"
#include "Poco/Util/Util.h"


namespace Poco
{
namespace Util
{


    class Application;
    class OptionSet;


    class Util_API Subsystem : public Poco::RefCountedObject
    /// Subsystems extend an application in a modular way.
    ///
    /// The Subsystem class provides a common interface
    /// for subsystems so that subsystems can be automatically
    /// initialized at startup and uninitialized at shutdown.
    ///
    /// Subsystems should also support dynamic reconfiguration,
    /// so that they can be reconfigured anytime during the
    /// life of a running application.
    ///
    /// The degree to which dynamic reconfiguration is supported
    /// is up to the actual subsystem implementation. It can
    /// range from ignoring the reconfiguration request (not
    /// recommended), to changing certain settings that affect
    /// the performance, to a complete reinitialization.
    {
    public:
        Subsystem();
        /// Creates the Subsystem.

        virtual const char * name() const = 0;
        /// Returns the name of the subsystem.
        /// Must be implemented by subclasses.

    protected:
        virtual void initialize(Application & app) = 0;
        /// Initializes the subsystem.

        virtual void uninitialize() = 0;
        /// Uninitializes the subsystem.

        virtual void reinitialize(Application & app);
        /// Re-initializes the subsystem.
        ///
        /// The default implementation just calls
        /// uninitialize() followed by initialize().
        /// Actual implementations might want to use a
        /// less radical and possibly more performant
        /// approach.

        virtual void defineOptions(OptionSet & options);
        /// Called before the Application's command line processing begins.
        /// If a subsystem wants to support command line arguments,
        /// it must override this method.
        /// The default implementation does not define any options.
        ///
        /// To effectively handle options, a subsystem should either bind
        /// the option to a configuration property or specify a callback
        /// to handle the option.

        virtual ~Subsystem();
        /// Destroys the Subsystem.

        friend class Application;

    private:
        Subsystem(const Subsystem &);
        Subsystem & operator=(const Subsystem &);
    };


}
} // namespace Poco::Util


#endif // Util_Subsystem_INCLUDED
